home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / hydra / hydracom.c < prev    next >
C/C++ Source or Header  |  1995-12-20  |  19KB  |  567 lines

  1. #define MAIN
  2. #include "hydracom.h"
  3.  
  4.  
  5. void main (int argc, char *argv[])
  6. {
  7.         FILE    *ctl;
  8.         char     ctlname[PATHLEN];
  9.         int      err = 0;              /* assume all went well: errorlevel 0 */
  10.         int      ac;
  11.         char    *p;
  12.         register int i, res;
  13.  
  14.         av = (char **) malloc(MAXARGS * ((int) sizeof (char *)));
  15.         port = 0;                                   /* default configuration */
  16.         strcpy(device,"serial.device");    /* OLSEN */
  17.         cur_speed = com_speed = 0U;
  18.         parity = false;
  19.         noinit = nocarrier = dropdtr = false;
  20.         nobell = false;
  21.         mailer = false;
  22.         hdxsession = nooriginator = false;
  23.         hydra_txwindow = hydra_rxwindow = 0L;
  24.         flowflags = 0;
  25.         dcdmask = 0x80;
  26.         noresume = nostamp = false;
  27.         hydra_options = 0x0L;
  28.         result = opuslog = NULL;
  29.         download = "";
  30.         single_file[0] = '\0';
  31.         single_done = false;
  32.         logfp = NULL;
  33.         loglevel = 2;
  34.         opustask = -1;
  35.         didsome = false;
  36. #if !WIN_AGL
  37.         file_x = 0;
  38. #endif
  39.  
  40. #ifndef AMIGA
  41.         signal(SIGINT,SIG_IGN);                            /* disable Ctrl-C */
  42. #endif    /* AMIGA */
  43.  
  44.         if (!getenv("TZ"))
  45.            putenv("TZ=GMT0");
  46.         tzset();
  47.         dos_sharecheck();
  48.  
  49. #if !WIN_AGL && !defined(AMIGA)
  50. /* HJW The Topspeed gettext and puttext window procedures do have a
  51.    bug in non video mode, at least in version 3.02. The only thing we
  52.    can do is to enable direct viodeo. Also: The clipping window
  53.    module reports always 25 x 80 as the screen dimensions. The bugs
  54.    are reported to JPI
  55. */
  56.  
  57. #ifdef _JPI_
  58.         directvideo = 1;
  59. #else
  60.         directvideo = 0;
  61. #endif
  62. #endif
  63.  
  64.         strcpy(ourname,argv[0]);
  65.         strcat(ourname,".");
  66.         if (getenv("DSZLOG"))
  67.            result = strdup(getenv("DSZLOG"));
  68.  
  69.         strcpy(work,ourname); strcat(work,"CFG");    /* extra configuration? */
  70.         if ((ctl=sfopen(work,"rt",DENY_WRITE)) != NULL) {
  71.            while (fgets(buffer,200,ctl)) {
  72.                  ac = parse(buffer);
  73.                  if (ac && !config(ac,av))
  74.                     message(1,"-Unknown configurationfile option '%s'",av[0]);
  75.            }
  76.            fclose(ctl);
  77.         }
  78.  
  79.         strcpy(ctlname,ourname); strcat(ctlname,"CTL");    /* Opus ext <1.10 */
  80.         if ((ctl=sfopen(ctlname,"rt",DENY_WRITE)) != NULL) {
  81.            strcpy(buffer,ourname); strcat(buffer,"LOG");
  82.            opuslog = strdup(buffer);
  83.            goto opusctl;
  84.         }
  85.  
  86. #ifndef AMIGA
  87.         for (i = 1; i < argc; i++)
  88.             strupr(argv[i]);
  89. #endif    /* AMIGA */
  90.  
  91.         i = 1;
  92.         while (i < argc) {
  93.               res = config(argc - i,&argv[i]);
  94.               if (res) {
  95.                  i += res;
  96.  
  97.                  if (opustask >= 0) {/* Opus External Interface Version 1.10 */
  98.                     strcpy(ctlname,ourname);
  99.                     sprintf(&ctlname[((int) strlen(ctlname)) - 3],"%02x.CTL",opustask);
  100.                     if ((ctl=sfopen(ctlname,"rt",DENY_WRITE)) == NULL) {
  101.                        message(1,"-Can't open Opus ext file '%s'",ctlname);
  102.                        break;
  103.                     }
  104.  
  105.                     strcpy(buffer,ourname);
  106.                     sprintf(&buffer[((int) strlen(buffer)) - 3],"%02x.LOG",opustask);
  107.                     opuslog = strdup(buffer);
  108.  
  109. opusctl:            if (ffirst(opuslog))           /* delete any old logfile */
  110.                        unlink(opuslog);
  111.                     while (fgets(buffer,200,ctl)) {
  112.                           ac = parse(buffer);
  113.                           if (!ac) continue;
  114.                           if (!stricmp(av[0],"SEND")) {    /* OLSEN */
  115.                              if (!didsome) {
  116.                                 init();
  117.                                 hydra_init(hydra_options);
  118.                              }
  119.                              didsome = true;
  120.                              err = batch_hydra(av[1],ac > 2 ? av[2] : NULL);
  121.                           }
  122.                           else
  123.                              config(ac,av);
  124.  
  125.                           /* quit on errors during zsend or zrecv */
  126.                           if (err) break;
  127.                     }/*while(fgets(ctl))*/
  128.  
  129.                     fclose(ctl);
  130.                     unlink(ctlname);
  131.  
  132.                     if (!err) {
  133.                        if (!didsome) {
  134.                           init();
  135.                           hydra_init(hydra_options);
  136.                        }
  137.                        didsome = true;
  138.                        hydra(NULL,NULL);
  139.                     }
  140.                     hydra_deinit();
  141.                     break;
  142.                  }/*if(opustask>=0)*/
  143.  
  144.               }/*if(res)*/
  145.  
  146.               else {
  147.                  if (!strnicmp(argv[i],"TER",3)) {    /* OLSEN */
  148.                     init();
  149.                     didsome = true;
  150.                     hydracom();
  151.                     break;
  152.                  }
  153.  
  154.                  if (!strnicmp(argv[i],"SEN",3)) {    /* OLSEN */
  155.                     init();
  156.                     didsome = true;
  157.                     hydra_init(hydra_options);
  158.                     while (!err && ++i < argc) {
  159.                           if (*argv[i]=='@') {
  160.                              argv[i]++;
  161.                              if ((ctl=sfopen(argv[i],"rt",DENY_WRITE))==NULL) {
  162.                                 message(3,"!Couldn't open batch-ctlfile %s",argv[i]);
  163.                                 continue;
  164.                              }
  165.                              while (!err && fgets(buffer,200,ctl)) {
  166.                                    if (parse(buffer))
  167.                                       err = batch_hydra(av[0],ac > 1 ? av[1] : NULL);
  168.                              }
  169.                              fclose(ctl);
  170.                           }
  171.                           else
  172.                              err = batch_hydra(argv[i],NULL);
  173.                     }
  174.  
  175.                     if (!err)
  176.                        hydra(NULL,NULL);               /* end of batch stuff */
  177.                     hydra_deinit();
  178.                     break;
  179.                  }
  180.  
  181.                  if (!strnicmp(argv[i],"GET",3)) {    /* OLSEN */
  182.                     init();
  183.                     didsome = true;
  184.                     hydra_init(hydra_options);
  185.                     if (++i < argc) {
  186.                        splitpath(argv[i],work,single_file);
  187.                        if (work[0]) {
  188.                           p = &work[((int) strlen(work)) - 1];
  189.  
  190.                           download = strdup(work);
  191.                        }
  192.                     }
  193.                     hydra(NULL,NULL);
  194.                     hydra_deinit();
  195.                     break;
  196.                  }
  197.  
  198.                  message(1,"-Unknown commandline parameter '%s'",argv[i]);
  199.                  i++;
  200.               }
  201.         }
  202.  
  203.         if (didsome) {
  204.            if (!carrier() && dropdtr)
  205.               dtr_out(0);
  206.            sys_reset();
  207.            endprog(err);
  208.         }
  209.         else
  210.            cprint("Run %s without any options for usage screen\n",PRGNAME);
  211.  
  212.         if (logfp) fclose(logfp);
  213.  
  214.         exit (err);
  215. }
  216.  
  217.  
  218. void endprog (int errcode)
  219. {
  220. #if WIN_AGL
  221.         if (didsome) win_deinit();
  222. #endif
  223.         message(1,"+%s v%s %s : end (exitcode=%d)",
  224.                   PRGNAME,VERSION,HC_OS,errcode);
  225.         resultlog(false,NULL,0L,0L);
  226.         if (logfp) fclose(logfp);
  227.         exit (errcode);
  228. }
  229.  
  230.  
  231. int config (int argc, char *argv[])
  232. {
  233.         register int opt = 0;
  234.         register word temp;
  235.  
  236.         if (!strnicmp(argv[0],"-P",2)) {  /* -p<port>  */    /* OLSEN */
  237.            port = atoi(&argv[0][2]);
  238.            opt++;
  239.         }
  240.         else if (!strnicmp(argv[0],"-B",2)) {  /* -b<speed> */
  241.            com_speed = (word) atol(&argv[0][2]);
  242.            opt++;
  243.         }
  244.         else if (!strnicmp(argv[0],"-T",2)) {  /* -t<task> */
  245.            opustask = atoi(&argv[0][2]);
  246.            opt++;
  247.         }
  248.         else if (!strnicmp(argv[0],"POR",3) && argc>=2) {  /* port */    /* OLSEN */
  249.            port = atoi(argv[1]);
  250.  
  251.            opt += 2;
  252.         }
  253.         else if (!strnicmp(argv[0],"DEV",3) && argc>=2) {  /* device */    /* OLSEN */
  254.            strcpy (device,argv[1]);
  255.            opt += 2;
  256.         }
  257.         else if ((!strnicmp(argv[0],"SPE",3) || !strnicmp(argv[0],"BAU",3)) && argc>=2) {    /* OLSEN */
  258.            com_speed = (word) atol(argv[1]);
  259.            opt += 2;
  260.         }
  261.         else if (!strnicmp(argv[0],"LIN",3)) {  /* line */
  262.            cur_speed = (word) atol(argv[1]);
  263.            opt += 2;
  264.         }
  265.         else if (!strnicmp(argv[0],"MOD",3) && argc >= 6) {  /* modem */
  266.            sscanf(argv[1],"%x",&port);
  267.            port--;
  268.            sscanf(argv[2],"%x",&com_speed);
  269.            sscanf(argv[3],"%x",&flowflags);
  270.            sscanf(argv[4],"%x",&dcdmask);
  271.            sscanf(argv[5],"%x",&cur_speed);
  272.            if (flowflags & 0x09)
  273.               hydra_options |= HOPT_XONXOFF;
  274.            opt += 6;
  275.         }
  276.         else if (!strnicmp(argv[0],"PAR",3)) {   /* parity */    /* OLSEN */
  277.            parity = true;
  278.            hydra_options |= HOPT_HIGHBIT;
  279.            opt++;
  280.         }
  281.         else if (!strnicmp(argv[0],"HAN",3) && argc >= 2) {   /* handshake */    /* OLSEN */
  282.            if      (!strnicmp(argv[1],"SOF",3)) flowflags |= 0x09;    /* OLSEN */
  283.            else if (!strnicmp(argv[1],"HAR",3)) flowflags |= 0x02;    /* OLSEN */
  284.            else if (!strnicmp(argv[1],"BOT",3)) flowflags |= 0x0b;    /* OLSEN */
  285.            else if (!strnicmp(argv[1],"NON",3)) flowflags = 0;    /* OLSEN */
  286.            if (flowflags & 0x09)
  287.               hydra_options |= HOPT_XONXOFF;
  288.            opt += 2;
  289.         }
  290.         else if (!strnicmp(argv[0],"NOI",3)) {   /* noinit */    /* OLSEN */
  291.            noinit = true;
  292.            opt++;
  293.         }
  294.         else if (!strnicmp(argv[0],"DRO",3)) {   /* dropdtr */    /* OLSEN */
  295.            dropdtr = true;
  296.            opt++;
  297.         }
  298.         else if (!strnicmp(argv[0],"NOB",3)) {   /* nobell */    /* OLSEN */
  299.            nobell = true;
  300.            opt++;
  301.         }
  302.         else if (!strnicmp(argv[0],"MAI",3)) {   /* mailer */    /* OLSEN */
  303.            mailer = true;
  304.            opt++;
  305.         }
  306.         else if (!strnicmp(argv[0],"NOO",3)) {   /* nooriginator */    /* OLSEN */
  307.            nooriginator = true;
  308.            opt++;
  309.         }
  310.         else if (!strnicmp(argv[0],"HDX",3)) {   /* hdxlink */    /* OLSEN */
  311.            hdxsession = true;
  312.            opt++;
  313.         }
  314.         else if (!strnicmp(argv[0],"TXW",3) && argc >= 2) {  /* txwindow */
  315.            hydra_txwindow = atol(argv[1]);
  316.            if (hydra_txwindow < 0L)
  317.               hydra_txwindow = 0L;
  318.            opt += 2;
  319.         }
  320.         else if (!strnicmp(argv[0],"RXW",3) && argc >= 2) {  /* rxwindow */
  321.            hydra_rxwindow = atol(argv[1]);
  322.            if (hydra_rxwindow < 0L)
  323.               hydra_rxwindow = 0L;
  324.            opt += 2;
  325.         }
  326.         else if (!strnicmp(argv[0],"NOC",3)) {   /* nocarrier */    /* OLSEN */
  327.            nocarrier = true;
  328.            opt++;
  329.         }
  330.         else if (!stricmp(argv[0],"LOG") && argc >= 2) {   /* log */    /* OLSEN */
  331.            if (logfp) fclose(logfp);
  332.            logfp = sfopen(argv[1],"at",DENY_WRITE);
  333.            if (logfp == NULL)
  334.               message(3,"-Couldn't open log-file %s",argv[1]);
  335.            opt += 2;
  336.         }
  337.         else if (!strnicmp(argv[0],"LEV",3) && argc>=2) {  /* level */    /* OLSEN */
  338.            temp = atoi(argv[1]);
  339.            if (temp >=0 && temp <= 6)
  340.               loglevel = temp;
  341.            else
  342.               message(6,"-Invalid log-level %d",temp);
  343.            opt +=2;
  344.         }
  345.         else if (!strnicmp(argv[0],"RES",3) && argc>=2) {  /* DSZ-format log */    /* OLSEN */
  346.            if (result) free(result);
  347.            result = strdup(argv[1]);
  348.            opt += 2;
  349.         }
  350.         else if ((!strnicmp(argv[0],"REC",3) || !strnicmp(argv[0],"UPL",3)) && argc>=2) {    /* OLSEN */
  351.            char *p;
  352.  
  353.            strcpy(work,argv[1]);
  354.  
  355.            download = strdup(work);
  356.            opt += 2;
  357.         }
  358.         else if (!strnicmp(argv[0],"NOR",3)) {             /* noresume */    /* OLSEN */
  359.            noresume = true;
  360.            opt++;
  361.         }
  362.         else if (!strnicmp(argv[0],"NOS",3)) {             /* nostamp */    /* OLSEN */
  363.            nostamp = true;
  364.            opt++;
  365.         }
  366.         else if (!strnicmp(argv[0],"OPT",3) && argc>=2) {  /* option  */    /* OLSEN */
  367.            if      (!stricmp(argv[1],"XONXOFF")) hydra_options |= HOPT_XONXOFF;    /* OLSEN */
  368.            else if (!stricmp(argv[1],"TELENET")) hydra_options |= HOPT_TELENET;
  369.            else if (!stricmp(argv[1],"CTLCHRS")) hydra_options |= HOPT_CTLCHRS;
  370.            else if (!stricmp(argv[1],"HIGHCTL")) hydra_options |= HOPT_HIGHCTL;
  371.            else if (!stricmp(argv[1],"HIGHBIT")) hydra_options |= HOPT_HIGHBIT;
  372.            else message(6,"-Invalid link option '%s'\n",argv[1]);
  373.            opt += 2;
  374.         }
  375.  
  376.         return (opt);
  377. }
  378.  
  379.  
  380. void init(void)
  381. {
  382.         /*if (logfp) fputs("\n",logfp);*/
  383.         message(1,"+%s v%s %s : begin",PRGNAME,VERSION,HC_OS);
  384.  
  385.         sys_init();
  386.  
  387. #if WIN_AGL
  388.         if (!win_init(10,CUR_NORMAL,CON_ANSI|CON_WRAP|CON_SCROLL|CON_UNBLANK,
  389.                       CHR_NORMAL,KEY_ANSI)) {
  390.            cprint("Can't initialize window system!\n");
  391.            exit (1);
  392.         }
  393. #endif
  394.  
  395.         dtr_out(1);
  396.  
  397.         if (com_speed)
  398.            com_setspeed(com_speed);
  399.         if (!com_speed)
  400.            com_speed = 2400U;
  401.         if (!cur_speed)
  402.            cur_speed = com_speed;
  403. }/*init()*/
  404.  
  405.  
  406. int batch_hydra (char *filespec, char *alias)
  407. {
  408.         char  path[PATHLEN];
  409.         char *p;
  410.         char  doafter;
  411.         int   fd;
  412.  
  413.         switch (*filespec) {
  414.                case '^':
  415.                case '#': doafter = *filespec++;
  416.                          break;
  417.                default:  doafter = 0;
  418.                          break;
  419.         }
  420.  
  421.         splitpath(filespec,path,work);
  422.         for (p = ffirst(filespec); p; p = fnext()) {
  423.             mergepath(work,path,p);
  424.             switch (hydra(work,alias)) {
  425.                    case XFER_ABORT:
  426.                         return (1);
  427.  
  428.                    case XFER_SKIP:
  429.                         break;
  430.  
  431.                    case XFER_OK:
  432.                         switch (doafter) {
  433.                                case '^':  /* Delete */
  434.                                     if (unlink(work))
  435.                                        message(6,"!HSEND: Could not delete %s",work);
  436.                                     else
  437.                                        message(1,"+Sent-H deleted %s",work);
  438.                                     break;
  439.  
  440.                                case '#':  /* Truncate */
  441.                                     if ((fd = dos_sopen(work,2)) < 0) {
  442.                                        message(6,"!HSEND: Error truncating %s",work);
  443.                                        break;
  444.                                     }
  445.                                     dos_close(fd);
  446.                                     message(1,"+Sent-H truncated %s",work);
  447.                                     break;
  448.  
  449.                                default:
  450.                                     message(1,"+Sent-H %s",work);
  451.                                     break;
  452.                         }
  453.                         break;
  454.             }
  455.         }
  456.  
  457.         return (0);
  458. }/*batch_hydra()*/
  459.  
  460.  
  461. void hydracom (void)
  462. {
  463.         static   char *hauto = "\030cA\\f5\\a3\030a";
  464.         register char *hseek = hauto;
  465.         register int   c, i;
  466.         boolean  echo;
  467.         int      mask;
  468.         char     queue[80];
  469.         long t;
  470.  
  471.         message(0,"+Entering terminal mode");
  472.         queue[0] =  '\0';
  473.         echo = false;
  474.         mask = parity ? 0x7f : 0xff;
  475.  
  476.         do {
  477. #if WIN_AGL
  478.            while (!win_keyscan()) {
  479. #elif defined(AMIGA)
  480.            while (!ConScanKey()) {
  481. #else
  482.            while (!kbhit()) {
  483. #endif
  484.                  if (!carrier()) {
  485.                     cprint("\007\n");
  486.                     message(1,"-Carrier lost, exiting (should use 'NOCarrier'?)");
  487.                     return;
  488.                  }
  489.  
  490.                  if ((c = com_getbyte()) != EOF) {
  491.                     c &= mask;
  492.                     if (c == 12)
  493.                        cprint("\033[2J");
  494.                     else
  495.                        cprint("%c",c);
  496.  
  497.                     if ((c & 0x7f) == *hseek) {
  498.                        if (!*++hseek) {
  499.                           hseek = hauto;
  500.                           goto autostart;
  501.                        }
  502.                     }
  503.                     else hseek = hauto;
  504.                  }
  505.                  else
  506.                     sys_idle();
  507.            }/*while*/
  508.  
  509.            switch (c = ConGetKey()) {
  510.  
  511.                   case EOF: break;
  512.                   case Alt_X: break;
  513.                   case Alt_C: cprint("\033[2J");
  514.                               break;
  515.                   case Alt_B: if (parity)
  516.                                  cprint("\r**Can't toggle 8th bit strip with parity 7E1\n");
  517.                               else {
  518.                                  mask ^= 0x80;
  519.                                  cprint("\r**Strip 8th bit %s\n",
  520.                                         (mask & 0x80) ? "Off" : "On");
  521.                               }
  522.                               break;
  523.                   case Alt_E: echo = !echo;
  524.                               cprint("\r**Local echo %s\n",
  525.                                      echo ? "On" : "Off");
  526.                               break;
  527.                   case Alt_H: dtr_out(0);
  528.                               for (t = time(NULL) + 1; time(NULL) < t; );
  529.                               dtr_out(1);
  530.                               cprint("\r**Dropped dtr\n");
  531.                               break;
  532.                   case PgUp:  switch (get_str("**Send",queue,70)) {
  533.                                      case -1: cprint("\r**Send queue cleared\n");
  534.                                               break;
  535.                                      case  0: cprint("\r**Send queue empty\n");
  536.                                               break;
  537.                                      default: cprint("\r**Queue will be sent during next session\n");
  538.                                               break;
  539.                               }
  540.                               break;
  541.                   case PgDn:
  542. autostart:                    hydra_init(hydra_options);
  543.                               c = 0;
  544.                               if (parse(queue))
  545.                                  for (i = 0; av[i] && ((c = batch_hydra(av[i],NULL)) == 0); i++);
  546.                               if (!c) hydra(NULL,NULL);
  547.                               hydra_deinit();
  548.                               queue[0] = '\0';
  549.                               cprint("\r**Finished\n");
  550.                               break;
  551.                   default:    if (c < 0x100) {
  552.                                  com_putbyte((byte) c);
  553.                                  if (echo) {
  554.                                     cprint("%c",c);
  555.                                     if (c == '\r') cprint("\n");
  556.                                  }
  557.                               }
  558.                               break;
  559.            }
  560.         } while (c != Alt_X && c != EOF);
  561.  
  562.         cprint("\n");
  563.         message(0,"+Exiting terminal mode");
  564. }/*hydracom()*/
  565.  
  566. /* end of hydracom.c */
  567.